/*
    HMR：host module replacement 热模块替换 / 模块热替换
    作用：一个模块发生变化，只会重新打包这一个模块（而不是所有模块）
        极大提升构建速度

        样式文件：可以使用HRM功能： 因为style-loader内部实现了
        js文件：默认不能使用HMR功能 --> 需要修改js代码，添加支持HMR功能的代码
            注意：HMR功能对js的处理，只能处理非入口js文件的其他文件
        html文件：默认不能使用HMR功能。同时会导致问题：html文件不能热更新（不用做HMR功能）
            解决：修改entry入口，将html文件引入
 */

const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    entry: ['./src/js/index.js', './src/index.html'],

    output: {
        filename: 'js/built.js',
        path: resolve(__dirname, 'build')
    },

    module: {
        rules: [
            // loader的配置
            {
                // 处理css资源
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader'
                ]
            },
            {
                // 处理less资源
                test: /\.less$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'less-loader'
                ]
            },

            // 处理图片资源
            {
                test: /\.(jpg|png|gif)$/,
                loader: 'url-loader',
                options: {
                    limit: 8 * 1024,
                    name: '[hash:10].[ext]',
                    // 关闭ES6模块化
                    esModule: false,
                    outputPath: 'imgs'
                }
            },

            // 处理html中img资源
            {
                test: /\.html$/,
                loader:'html-loader',
                options: {
                    esModule: false
                }
            },

            // 处理其他资源
            {
                exclude: /\.(html|js|css|less|png|jpg|gif)$/,
                loader: 'file-loader',
                options: {
                    name: '[hash:10].[ext]',
                    outputPath: 'media'
                }
            }

        ]
    },

    plugins: [
        // plugins的配置
        new HtmlWebpackPlugin({
            template: './src/index.html'
        })
    ],

    mode: 'development',

    // 开发环境
    devServer: {
        contentBase: resolve(__dirname, 'build'),
        compress: true,
        port: 9999,
        open: true,
        // 开启HMR功能
        // 当修改了webpack配置，新配置要想生效，必须重新webpack服务
        hot: true
    }
}